const gulp = require('gulp');
const htmlmin = require('gulp-htmlmin');
const cleanCSS = require('gulp-clean-css');
const uglify = require('gulp-uglify');
const { src, dest, series, parallel } = gulp;

// 动态导入 ES 模块
let del;

async function loadDel() {
  if (!del) {
    del = await import('del');
  }
  return del;
}

// 清理 dist 目录
async function clean() {
  const delModule = await loadDel();
  return delModule.deleteAsync(['dist']);
}

// 处理 HTML 文件（根目录和 pages 文件夹）
function html() {
  return src(['*.html', 'pages/**/*.html'], { base: '.' })
    .pipe(htmlmin({
      collapseWhitespace: true,
      removeComments: true,
      removeRedundantAttributes: false, // 保留type="text"等属性，确保CSS选择器正常工作
      removeScriptTypeAttributes: true,
      removeStyleLinkTypeAttributes: true,
      useShortDoctype: true,
      minifyCSS: true,
      minifyJS: true
    }))
    .pipe(dest('dist'));
}

// 处理 CSS 文件
function css() {
  return src('css/**/*.css', { base: '.' })
    .pipe(cleanCSS({
      compatibility: 'ie8',
      level: 1 // 使用安全的压缩级别，移除format选项以实现完全压缩
    }))
    .pipe(dest('dist'));
}

// 处理 JavaScript 文件
function js() {
  return src('js/**/*.js', { base: '.' })
    .pipe(uglify({
      compress: {
        drop_console: true,
        drop_debugger: true
      },
      mangle: true
    }))
    .pipe(dest('dist'));
}

// 处理服务器端 JavaScript 文件
function serverJs() {
  return src('server/**/*.js', { base: '.' })
    .pipe(uglify({
      compress: {
        drop_console: false, // 保留服务器端的 console
        drop_debugger: true
      },
      mangle: true
    }))
    .pipe(dest('dist'));
}

// 复制 JSON 文件（不压缩）
function json() {
  return src(['js/**/*.json', 'package.json', 'package-lock.json'], { base: '.' })
    .pipe(dest('dist'));
}

// 复制图片文件（不压缩）
function images() {
  return src('img/**/*', { base: '.', encoding: false })
    .pipe(dest('dist'));
}

// 复制 ico 文件和其他静态文件
function assets() {
  return src([
    'favicon.ico',
    'img/**/*.ico',
    'img/**/.gitkeep',
    '.gitignore',
    'README.md',
    'LICENSE'
  ], { allowEmpty: true, encoding: false }) // 添加encoding: false处理二进制文件
    .pipe(dest((file) => {
      if (file.basename === 'favicon.ico') {
        return 'dist';
      }
      if (file.dirname.includes('img')) {
        return 'dist/img';
      }
      return 'dist';
    }));
}

// 创建 dist 目录结构
function createDirs() {
  return src('*.*', { read: false })
    .pipe(dest('dist'));
}

// 构建任务
const build = series(
  clean,
  createDirs,
  parallel(
    html,
    css,
    js,
    serverJs,
    json,
    images,
    assets
  )
);

// 导出任务
exports.clean = clean;
exports.html = html;
exports.css = css;
exports.js = js;
exports.serverJs = serverJs;
exports.json = json;
exports.images = images;
exports.assets = assets;
exports.build = build;
exports.default = build;